﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client;
using System.Configuration;
using Entidades.Catalogo;
using System.Data;

namespace Persistencia.Catalogo
{
    public class PerPredio : Persistencia.General.IPersistencia
    {
        public void Insertar(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            conexion.Open();

            comando = new OracleCommand("PKG_PREDIO_AFECTADO.setpredioafectado", conexion);
            comando.CommandType = System.Data.CommandType.StoredProcedure;

            try
            {
                //Cat_Persona Afectado
                OracleParameter parametro0 = new OracleParameter();
                parametro0.OracleDbType = OracleDbType.Varchar2;
                parametro0.Value = ((EntPredio)entidad).Afectado.Nombre;
                parametro0.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro0);

                OracleParameter parametro1 = new OracleParameter();
                parametro1.OracleDbType = OracleDbType.Varchar2;
                parametro1.Value = ((EntPredio)entidad).Afectado.Paterno;
                parametro1.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro1);

                OracleParameter parametro2 = new OracleParameter();
                parametro2.OracleDbType = OracleDbType.Varchar2;
                parametro2.Value = ((EntPredio)entidad).Afectado.Materno;
                parametro2.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro2);

                OracleParameter parametro3 = new OracleParameter();
                parametro3.OracleDbType = OracleDbType.Varchar2;
                parametro3.Value = ((EntPredio)entidad).Afectado.Sexo;
                parametro3.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro3);

                OracleParameter parametro4 = new OracleParameter();
                parametro4.OracleDbType = OracleDbType.Varchar2;
                parametro4.Value = ((EntPredio)entidad).Afectado.RFC;
                parametro4.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro4);

                OracleParameter parametro5 = new OracleParameter();
                parametro5.OracleDbType = OracleDbType.Varchar2;
                parametro5.Value = ((EntPredio)entidad).Afectado.ClaveElector;
                parametro5.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro5);

                //Datos del Predio Cat_Predio
                OracleParameter parametro6 = new OracleParameter();
                parametro6.OracleDbType = OracleDbType.Varchar2;
                parametro6.Value = ((EntPredio)entidad).CveLocalidad;
                parametro6.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro6);

                OracleParameter parametro7 = new OracleParameter();
                parametro7.OracleDbType = OracleDbType.Varchar2;
                parametro7.Value = ((EntPredio)entidad).Superficie;
                parametro7.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro7);

                OracleParameter parametro8 = new OracleParameter();
                parametro8.OracleDbType = OracleDbType.Varchar2;
                parametro8.Value = ((EntPredio)entidad).NoPredio;
                parametro8.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro8);

                OracleParameter parametro9 = new OracleParameter();
                parametro9.OracleDbType = OracleDbType.Varchar2;
                parametro9.Value = ((EntPredio)entidad).Denominado;
                parametro9.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro9);

                OracleParameter parametro10 = new OracleParameter();
                parametro10.OracleDbType = OracleDbType.Varchar2;
                parametro10.Value = ((EntPredio)entidad).Norte;
                parametro10.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro10);

                OracleParameter parametro11 = new OracleParameter();
                parametro11.OracleDbType = OracleDbType.Varchar2;
                parametro11.Value = ((EntPredio)entidad).Sur;
                parametro11.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro11);

                OracleParameter parametro12 = new OracleParameter();
                parametro12.OracleDbType = OracleDbType.Varchar2;
                parametro12.Value = ((EntPredio)entidad).Este;
                parametro12.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro12);

                OracleParameter parametro13 = new OracleParameter();
                parametro13.OracleDbType = OracleDbType.Varchar2;
                parametro13.Value = ((EntPredio)entidad).Oeste;
                parametro13.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro13);

                OracleParameter parametro14 = new OracleParameter();
                parametro14.OracleDbType = OracleDbType.Varchar2;
                parametro14.Value = ((EntPredio)entidad).Acreditado;
                parametro14.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro14);

                OracleParameter parametro15 = new OracleParameter();
                parametro15.OracleDbType = OracleDbType.Varchar2;
                parametro15.Value = ((EntPredio)entidad).NoAcreditado;
                parametro15.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro15);

                OracleParameter parametro16 = new OracleParameter();
                parametro16.OracleDbType = OracleDbType.Varchar2;
                parametro16.Value = ((EntPredio)entidad).FechaAcreditado;
                parametro16.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro16);

                OracleParameter parametro17 = new OracleParameter();
                parametro17.OracleDbType = OracleDbType.Varchar2;
                parametro17.Value = ((EntPredio)entidad).NoNotario;
                parametro17.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro17);

                OracleParameter parametro18 = new OracleParameter();
                parametro18.OracleDbType = OracleDbType.Varchar2;
                parametro18.Value = ((EntPredio)entidad).NoEscritura;
                parametro18.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro18);

                OracleParameter parametro19 = new OracleParameter();
                parametro19.OracleDbType = OracleDbType.Varchar2;
                parametro19.Value = ((EntPredio)entidad).Volumen;
                parametro19.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro19);

                OracleParameter parametro20 = new OracleParameter();
                parametro20.OracleDbType = OracleDbType.Varchar2;
                parametro20.Value = ((EntPredio)entidad).NoNotaria;
                parametro20.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro20);

                OracleParameter parametro21 = new OracleParameter();
                parametro21.OracleDbType = OracleDbType.Varchar2;
                parametro21.Value = ((EntPredio)entidad).CveTipoAcreditacion;
                parametro21.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro21);

                OracleParameter parametro22 = new OracleParameter();
                parametro22.OracleDbType = OracleDbType.Varchar2;
                parametro22.Value = ((EntPredio)entidad).Referencia;
                parametro22.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro22);

                OracleParameter parametro23 = new OracleParameter();
                parametro23.OracleDbType = OracleDbType.Varchar2;
                parametro23.Value = ((EntPredio)entidad).Afectado.CveAfectado;
                parametro23.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro23);

                OracleParameter parametro24 = new OracleParameter();
                parametro24.OracleDbType = OracleDbType.Varchar2;
                parametro24.Value = ((EntPredio)entidad).CvePredio;
                parametro24.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro24);

                OracleParameter parametro25 = new OracleParameter();
                parametro25.OracleDbType = OracleDbType.Varchar2;
                parametro25.Value = ((EntPredio)entidad).Accion;
                parametro25.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro25);

                comando.ExecuteNonQuery();

            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje:  " + exc.Message);
                excepcion.Source = "PerPredio.Insertar";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje:  " + exc.Message);
                excepcion.Source = "PerPredio.Insertar";
                throw excepcion;
            }
            finally
            {
                comando = null;
                if (conexion != null)
                    if (conexion.State == System.Data.ConnectionState.Open) conexion.Close();
            }
        }

        public void Actualizar(Entidades.General.IEntidad entidad)
        {
            throw new NotImplementedException();
        }

        public void Eliminar(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            conexion.Open();

            comando = new OracleCommand("PKG_PREDIO_AFECTADO.EliminarPredio", conexion);
            comando.CommandType = System.Data.CommandType.StoredProcedure;

            try
            {
                OracleParameter parametro0 = new OracleParameter();
                parametro0.OracleDbType = OracleDbType.Varchar2;
                parametro0.Value = ((EntPredio)entidad).CvePredio;
                parametro0.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro0);

                comando.ExecuteNonQuery();

            }
            finally
            {
                comando = null;
                if (conexion != null)
                    if (conexion.State == System.Data.ConnectionState.Open) conexion.Close();
            }
        }

        public Entidades.General.IEntidad Obtener(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;
            EntPredio ent = null;

            try
            {
                comando = new OracleCommand("PKG_PREDIO_AFECTADO.getpredioafectado", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();

                OracleParameter parametro1 = new OracleParameter();
                parametro1.OracleDbType = OracleDbType.Varchar2;
                parametro1.Value = ((EntPredio)entidad).CvePredio;
                parametro1.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro1);

                OracleParameter parametro2 = new OracleParameter();
                parametro2.OracleDbType = OracleDbType.Varchar2;
                parametro2.Value = ((EntPredio)entidad).CveAfectado;
                parametro2.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro2);

                OracleParameter cursor = new OracleParameter();
                cursor.OracleDbType = OracleDbType.RefCursor;
                cursor.Direction = ParameterDirection.Output;
                comando.Parameters.Add(cursor);


                lector = comando.ExecuteReader(CommandBehavior.CloseConnection);

                while (lector.Read())
                {
                    ent = new EntPredio();
                    ent.CvePredio = int.Parse(lector["cve_predio"] == DBNull.Value ? "0" : lector["cve_predio"].ToString());
                    ent.CveAfectado = int.Parse(lector["cve_afectado"] == DBNull.Value ? "0" : lector["cve_afectado"].ToString());
                    ent.CveLocalidad = int.Parse(lector["cve_localidad"] == DBNull.Value ? "0" : lector["cve_localidad"].ToString());
                    ent.CveMunicipio = int.Parse(lector["cve_municipio"] == DBNull.Value ? "0" : lector["cve_municipio"].ToString());
                    ent.CveTipoAcreditacion = lector["cve_tipo_acreditacion"].ToString();

                    ent.Acreditado = lector["acreditado"].ToString();
                    ent.FechaAcreditado = lector["acreditado_fecha"].ToString();
                    ent.Denominado = lector["denominado"].ToString();
                    ent.FechaAcreditado = lector["acreditado_fecha"].ToString();
                    ent.Este = lector["este"].ToString();

                    ent.NoAcreditado = lector["acreditado_no"].ToString();
                    ent.NoEscritura = lector["no_escritura"].ToString();
                    ent.NoNotaria = lector["no_notaria"].ToString();
                    ent.NoNotario = lector["no_notario"].ToString();

                    ent.NoPredio = lector["no_predio"].ToString(); ;
                    ent.Norte = lector["norte"].ToString();

                    ent.Oeste = lector["oeste"].ToString();
                    ent.Referencia = lector["referencia"].ToString();

                    ent.Superficie = lector["Superficie"].ToString();

                    ent.Sur = lector["sur"].ToString();
                    ent.Volumen = lector["volumen"].ToString();

                    ent.Afectado = new EntPersonas();
                    ent.Afectado.CveAfectado = int.Parse(lector["cve_afectado"] == DBNull.Value ? "0" : lector["cve_afectado"].ToString());
                    ent.Afectado.ClaveElector = lector["clave_elector"].ToString();
                    ent.Afectado.Materno = lector["apellido_m"].ToString();
                    ent.Afectado.Nombre = lector["nombre"].ToString();
                    ent.Afectado.Paterno = lector["apellido_p"].ToString();
                    ent.Afectado.RFC = lector["rfc"].ToString();
                    ent.Afectado.Sexo = lector["sexo"].ToString();
                }
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerPredio.Obtener";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerPredio.Obtener";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
            return ent;
        }

        public List<Entidades.General.IEntidad> ObtenerTodos(Entidades.General.IEntidad entidad)
        {
            throw new NotImplementedException();
        }

        public List<Entidades.General.IEntidad> ObtenerTodos()
        {
            throw new NotImplementedException();
        }

        public List<Entidades.General.IEntidad> CriteriosObtenerTodos(string ValorBusqueda, string Criterio, string CveLocalidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;
            EntPredio ent = null;
            List<Entidades.General.IEntidad> lista = new List<Entidades.General.IEntidad>();

            try
            {
                comando = new OracleCommand("PKG_PREDIO_AFECTADO.getpredioafectadoCriterios", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();

                OracleParameter parametro2 = new OracleParameter();
                parametro2.OracleDbType = OracleDbType.Varchar2;
                parametro2.Value = Criterio;
                parametro2.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro2);

                OracleParameter parametro1 = new OracleParameter();
                parametro1.OracleDbType = OracleDbType.Varchar2;
                parametro1.Value = ValorBusqueda;
                parametro1.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro1);

                OracleParameter parametro3 = new OracleParameter();
                parametro3.OracleDbType = OracleDbType.Varchar2;
                parametro3.Value = CveLocalidad;
                parametro3.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro3);

                OracleParameter cursor = new OracleParameter();
                cursor.OracleDbType = OracleDbType.RefCursor;
                cursor.Direction = ParameterDirection.Output;
                comando.Parameters.Add(cursor);

                lector = comando.ExecuteReader(CommandBehavior.CloseConnection);

                while (lector.Read())
                {
                    ent = new EntPredio();
                    ent.CvePredio = int.Parse(lector["cve_predio"] == DBNull.Value ? "0" : lector["cve_predio"].ToString());
                    ent.CveAfectado = int.Parse(lector["cve_afectado"] == DBNull.Value ? "0" : lector["cve_afectado"].ToString());
                    ent.CveLocalidad = int.Parse(lector["CVE_LOCALIDAD"] == DBNull.Value ? "0" : lector["CVE_LOCALIDAD"].ToString());
                    ent.NoPredio = lector["no_predio"].ToString();
                    ent.Acreditado = lector["ACREDITADO"].ToString();
                    ent.CveTipoAcreditacion = lector["CVE_TIPO_ACREDITACION"].ToString();
                    ent.Denominado = lector["DENOMINADO"].ToString();
                    ent.Superficie = lector["SUPERFICIE"].ToString();
                    ent.NoEscritura = lector["nombre_completo"].ToString();
                    ent.NoNotaria = lector["veces_afectado"].ToString();
                    ent.NoNotario = lector["veces_tramitado"].ToString();
                    ent.Referencia = lector["ubicacion"].ToString();
                    ent.NombreAfectado = lector["nombre_afectado"].ToString();
                    lista.Add(ent);
                }
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerUsuario.CriteriosObtenerTodos";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerUsuario.CriteriosObtenerTodos";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
            return lista;
        }
    }
}
